package com.wingsoft.basic.service.impl;

import com.wingsoft.common.exception.ServiceException;
import java.util.ArrayList;
import java.util.List;

import com.wingsoft.system.domain.SysConfig;
import org.apache.commons.lang3.ObjectUtils;
import com.wingsoft.common.utils.bean.BeanUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.wingsoft.basic.mapper.SoraConfigMapper;
import com.wingsoft.basic.domain.SoraConfig;
import com.wingsoft.basic.service.ISoraConfigService;
import com.wingsoft.common.utils.IdGenerator.IdGeneratorFactory;
import com.wingsoft.basic.dto.SoraConfigDto;
import com.wingsoft.basic.vo.SoraConfigVo;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * 系统配置Service业务层处理
 * 
 * @author hemj
 * @date 2025-10-24
 */
@Service
public class SoraConfigServiceImpl extends MPJBaseServiceImpl<SoraConfigMapper, SoraConfig> implements ISoraConfigService
{
    @Autowired
    private IdGeneratorFactory idGeneratorFactory;
    
    /**
         * 验证参数
         */
    private void validateData(SoraConfig soraConfig){
        if (ObjectUtils.isEmpty(soraConfig.getType())){
            throw new ServiceException("类型不能为空");
        }
        if (ObjectUtils.isEmpty(soraConfig.getAppkey())){
            throw new ServiceException("key不能为空");
        }
        if (ObjectUtils.isEmpty(soraConfig.getSeqNo())){
            throw new ServiceException("优先级不能为空");
        }
    }

    public SoraConfig getNextSoraConfig(String hisInterfaceType){
        LambdaQueryWrapper<SoraConfig> queryWrapper = new LambdaQueryWrapper<>();
        if (!ObjectUtils.isEmpty(hisInterfaceType)){
            String[] hisTypes = hisInterfaceType.split(",");
            queryWrapper.notIn(SoraConfig::getType, hisTypes);
        }
        queryWrapper.orderByAsc(SoraConfig::getSeqNo);
        queryWrapper.last("limit 1");
        return this.getOne(queryWrapper,false);
    }

    /**
     * 保存数据
     */
    @Transactional(timeout = 3000, isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED)
    public SoraConfig saveCascade(SoraConfigDto soraConfigDto){
        SoraConfig soraConfig = new SoraConfig();
        BeanUtils.copyProperties(soraConfigDto,soraConfig);
        validateData(soraConfig);
        soraConfig.setId(idGeneratorFactory.getId(SoraConfig.class.getSimpleName()));
        this.save(soraConfig);
        return soraConfig;
    }
    /**
     * 编辑数据
     */
    @Transactional(timeout = 3000, isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED)
    public SoraConfig updateCascade(SoraConfigDto soraConfigDto){
        SoraConfig soraConfig = this.getById(soraConfigDto.getId());;
        BeanUtils.copyPropertiesIgnoreNull(soraConfigDto,soraConfig);
        validateData(soraConfig);
        this.updateById(soraConfig);
        return soraConfig;
    }

    /**
     * 初始化查询条件
     */
    public MPJLambdaWrapper<SoraConfig> initQueryWrapper(SoraConfigDto soraConfigDto){
        MPJLambdaWrapper<SoraConfig> queryWrapper = new MPJLambdaWrapper<>();
        if (!ObjectUtils.isEmpty(soraConfigDto.getType())) {
            queryWrapper.eq(SoraConfig::getType, soraConfigDto.getType());
        }
        if (!ObjectUtils.isEmpty(soraConfigDto.getAppkey())) {
            queryWrapper.eq(SoraConfig::getAppkey, soraConfigDto.getAppkey());
        }
        if (!ObjectUtils.isEmpty(soraConfigDto.getSeqNo())) {
            queryWrapper.eq(SoraConfig::getSeqNo, soraConfigDto.getSeqNo());
        }
        queryWrapper.orderByAsc(SoraConfig::getSeqNo);
        return queryWrapper;
    }

    /**
     * list查询
     */
    public List<SoraConfigVo> queryList(SoraConfigDto soraConfigDto) {
        List<SoraConfig> soraConfigs = this.selectJoinList(SoraConfig.class,initQueryWrapper(soraConfigDto));
        List<SoraConfigVo> vos = new ArrayList<>();
        for (SoraConfig soraConfig:soraConfigs) {
            SoraConfigVo soraConfigVo = new SoraConfigVo();
            BeanUtils.copyProperties(soraConfig,soraConfigVo);
            vos.add(soraConfigVo);
        }
        return vos;
    }

    /**
     * 统计
     */
    public long countList(SoraConfigDto soraConfigDto) {
        return this.count(initQueryWrapper(soraConfigDto));
    }

    /**
     * 获取单个数据
     */
    public SoraConfigVo getOneById(Long id){
        SoraConfig soraConfig = this.getById(id);
        SoraConfigVo soraConfigVo = new SoraConfigVo();
        BeanUtils.copyProperties(soraConfig,soraConfigVo);
        return soraConfigVo;
    }

    /**
     * 删除数据
     * @param ids
     */
    @Transactional(timeout = 3000, isolation = Isolation.READ_UNCOMMITTED, propagation = Propagation.REQUIRED)
    public void removeByIdList(List<Long> ids) {
        this.removeByIds(ids);
    }

    public SoraConfig getByType(String nowInterfaceType) {
        LambdaQueryWrapper<SoraConfig> soraConfigLambdaQueryWrapper = new LambdaQueryWrapper<>();
        soraConfigLambdaQueryWrapper.eq(SoraConfig::getType, nowInterfaceType);
        SoraConfig soraConfig = this.getOne(soraConfigLambdaQueryWrapper,false);
        return soraConfig;
    }

}
